#ifndef __NETWORK_H__
#define __NETWORK_H__

#include "network_common.h"

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief 获取设备能力回调
 * @param [out]  能力信息
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationGetAbilityCb)(NetworkAbilitySupportFunction* );

typedef enum {
    NETWORK_SYSTEM_REBOOT = 0x01000, // 重启
    NETWORK_SYSTEM_RESET,           // 恢复出厂
    NETWORK_SYSTEM_FORMAT,          // 格式化
    NETWORK_SYSTEM_DEVICE_INFO,     // 设备信息
    NETWORK_SYSTEM_SET_TIME,        // 设置时间
    NETWORK_SYSTEM_GET_RTSP_URL,    // 获取rtsp_url
    NETWORK_SYSTEM_INFO,        	// 获取系统信息
    NETWORK_SYSTEM_GET_TIME,        // 获取时间
}NetworkSystemType;
typedef struct {
    int type;   // NetworkSystemType
    int cam;	// 摄像头

    union {
        int time;								// 设置的UTC时间
    } in;

    union {
        NetworkSystemDeviceInfo device_info;	// 获取的设备信息
        NetworkSystemRtspUrl rtsp_url;			// 获取的rtsp地址
        NetworkSystemInfo system_info; 			// 系统信息
		int cur_time;							// 当前UTC时间
    } out;
}NetworkSystem;
/**
 * @brief 系统请求回调
 * @param [in]  请求信息
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationSystemCb)(NetworkSystem* );

typedef enum {
    NETWORK_CONFIG_SYSTEM_TIME_INFO = 0x02000,		// 时间信息, NetworkConfigSystemTimeInfo
	NETWORK_CONFIG_SYSTEM_USER_MANAGER,				// 用户管理, NetworkConfigSystemUserManager

    NETWORK_CONFIG_CAMERA_IR_IMAGE_INFO = 0x02100,	// 红外图像信息, NetworkConfigCameraIrImageInfos
    NETWORK_CONFIG_CAMERA_IR_IMAGE_ENHANCE,			// 红外图像增强, NetworkConfigCameraIrImageEnhance
    NETWORK_CONFIG_CAMERA_IR_IMAGE_ZOOM,			// 红外图像变倍, NetworkConfigCameraIrImageZooms
    NETWORK_CONFIG_CAMERA_IR_FOCUSING,				// 红外调焦, NetworkConfigCameraIrFocusings
    NETWORK_CONFIG_CAMERA_IR_CALIBRATIONS,			// 红外校正, NetworkConfigCameraIrCalibrations
	NETWORK_CONFIG_CAMERA_IR_OSD_INFO,				// 红外osd叠加，NetworkConfigCameraIrOsdInfos
	NETWORK_CONFIG_CAMERA_IR_ENCODE_INFO,			// 红外视频编码信息，NetworkConfigCameraIrEncodeInfos
	NETWORK_CONFIG_CAMERA_IR_LDC_INFO,				// 红外畸变校正信息，NetworkConfigCameraIrLdcInfos

    NETWORK_CONFIG_CAMERA_VIS_IMAGE_INFO = 0x02200,	// 可见光图像信息, NetworkConfigCameraVisImageInfos
    NETWORK_CONFIG_CAMERA_VIS_IMAGE_ZOOM,			// 可见光图像变倍, NetworkConfigCameraVisImageZooms
    NETWORK_CONFIG_CAMERA_VIS_FOCUSING,				// 可见光图像信息, NetworkConfigCameraVisFocusings

	NETWORK_CONFIG_PTZ_INFO = 0x02300,				// 全景云台信息, NetworkConfigPtzInfo
	NETWORK_CONFIG_PTZ_PRESETS,						// 预置点, NetworkConfigPtzPresets

	NETWORK_CONFIG_ALGORITHM_DETECTION = 0x02400,	// 图像算法，NetworkConfigAlgorithmDetection
	NETWORK_CONFIG_ALGORITHM_AREAS,					// 算法区域，NetworkConfigAlgorithmAreas
	NETWORK_CONFIG_ALGORITHM_IMAGE,					// 图像算法，NetworkConfigAlgorithmImage

	NETWORK_CONFIG_NETWORK_TCP_IP = 0x02500,			// TCP/IP配置，NetworkConfigNetworkTcpIp
	NETWORK_CONFIG_NETWORK_NTP_INFO,					// NTP信息, NetworkConfigNetworkNtpInfo

	NETWORK_CONFIG_DISPLAY_SCREEN_INFO = 0x02600,	// 设备显示屏信息，NetworkConfigDisplayScreenInfo
	NETWORK_CONFIG_DISPLAY_SCREEN_CALIBRATION_GUN,	// 校抢，NetworkConfigDisplayScreenCalibrationGun
	NETWORK_CONFIG_DISPLAY_SCREEN_RED_DOT_INFO,		// 红点，NetworkConfigDisplayScreenRedDotInfo

	NETWORK_CONFIG_OTHER_INFO = 0x02700,				// 其他信息，NetworkConfigOtherInfo
	NETWORK_CONFIG_OTHER_PREVIEW,					// 预览，NetworkConfigOtherPreview
	NETWORK_CONFIG_OTHER_POSITION,					// 定位，NetworkConfigOtherPosition

	NETWORK_CONFIG_STORAGE_INFO = 0x02800,			// 存储信息，NetworkConfigStorageInfo
	NETWORK_CONFIG_STORAGE_RECORD_PROGRAM,			// 录像计划，NetworkConfigStorageRecordProgram
	NETWORK_CONFIG_STORAGE_SNAP_PROGRAM,			// 抓拍计划，NetworkConfigStorageSnapProgram
	NETWORK_CONFIG_STORAGE_SNAP_PARAM,				// 抓拍参数，NetworkConfigStorageSnapParam

}NetworkConfigType;
/**
 * @brief 获取配置回调
 * @param [in]  配置类型，NetworkConfigType
 * @param [out]  配置结构体，NetworkConfig_xxx
 * @param [in]  结构体大小
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationGetConfigCb)(int , void* , int );

/**
 * @brief 设置配置回调
 * @param [in]  配置类型，NetworkConfigType
 * @param [in]  配置结构体，NetworkConfig_xxx
 * @param [in]  结构体大小
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationSetConfigCb)(int , void* , int );

typedef enum {
    NETWORK_CONTORL_SNAP = 0x03000,				// 抓拍 NetworkContorlSnap
    NETWORK_CONTORL_RECORD,						// 录像 NetworkContorlRecord
    NETWORK_CONTORL_PTZ,						// 云台 NetworkContorlPtzCtrl
	NETWORK_CONTORL_FILE_OPERATION,				// 设备文件操作 NetworkContorlFileOperation
	NETWORK_CONTORL_DEVICE_STATUS,				// 查询设备状态 NetworkContorlDeviceStatus
	NETWORK_CONTORL_TELNET,						// telnet功能 NetworkContorlTelnet

    NETWORK_CONTORL_BAD_PIX = 0x03800,			// 坏点 NetworkContorlBadPix
    NETWORK_CONTORL_SHUTTER_CALIBRATION,		// 快门校正 NetworkContorlShutterCalibration
    NETWORK_CONTORL_LASER_RANGING,				// 测距 NetworkContorlLaserRanging
    NETWORK_CONTORL_TRACKING,					// 跟踪 NetworkContorlTrackingObject
    NETWORK_CONTORL_IR_FOCUSING,	            // 红外调焦 NetworkContorlIrFocusing
    NETWORK_CONTORL_CVBS_SWITCH_PREVIEW,	    // cvbs预览通道切换 NetworkContorlCvbsSwitchPreview
}NetworkContorlType;

/**
 * @brief 控制请求回调
 * @param [in]  控制类型，NetworkContorlType
 * @param [in]  设备通道
 * @param [in]  结构体，NetworkContorl_xxx
 * @param [in]  结构体大小
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationControlCb)(int, int, void*, int);

/**
 * @brief 升级回调
 * @param [in]  升级包信息
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationUpgradeCb)(NetworkUpgradeInfo* );

typedef struct {
    char type[32];	// 透传类型，【PTZ：云台透传】【IR_camera.[chn]：红外机芯,chn表示通道号】
    char* in;
    char* out;      // 默认1024空间，空间不足可用realloc重载空间
}NetworkTransparentTransmission;
/**
 * @brief 透传回调
 * @param [in]  透传信息
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationTransparentTransmissionCb)(NetworkTransparentTransmission*);

typedef enum {
	NETWORK_INTERNAL_RECORD_RAW = 0x05000,				// 录制原始数据 NetworkContorlRecord
}NetworkInternalType;
/**
 * @brief 内部请求回调
 * @param [in]  请求类型，NetworkContorlType
 * @param [in]  设备通道
 * @param [in]  结构体，NetworkContorl_xxx
 * @param [in]  结构体大小
 * @return 成功返回 0
 *         失败返回 其他值
*/
typedef int (*NetworkOperationInternalCb)(int, int, void*, int);     // type, cam, st, st_size

typedef enum {
    NETWORK_OPERATION_GET_ABILITY,                  // NetworkOperationGetAbilityCb   
    NETWORK_OPERATION_SYSTEM_REQUEST,               // NetworkOperationSystemCb
    NETWORK_OPERATION_GET_CONFIG,                   // NetworkOperationGetConfigCb
    NETWORK_OPERATION_SET_CONFIG,                   // NetworkOperationSetConfigCb
    NETWORK_OPERATION_CONTORL_REQUEST,              // NetworkOperationControlCb
    NETWORK_OPERATION_UPGRADE,                      // NetworkOperationUpgradeCb
    NETWORK_OPERATION_TRANSPARENT_TRANSMISSION,     // NetworkOperationTransparentTransmissionCb
    NETWORK_OPERATION_INTERNAL_REQUEST,     		// NetworkOperationInternalCb
}NetworkOperationType;
/**
 * @brief 回调注册接口
 * @param [in]  回调类型，NetworkOperationType
 * @param [in]  回调函数，NetworkOperation_xxx
 */
void NetworkOperationRegister(NetworkOperationType type, void* cb);

typedef struct {
	const char* log_path;			// 日志路径，【NULL:"/data/logs"】
	const char* conf_path;			// 配置路径，【NULL:"/data/confs"】
	const char* download_path;		// 下载路径，【NULL:"/data/download"】
}NetworkInitialInfo;
/**
 * @brief 网络初始化
 * @param [in] info 网络初始化需要的初始信息
 * @return 成功返回 0
 *         失败返回 其他值
*/
int NetworkInit(NetworkInitialInfo* info);

/**
 * @brief 网络反初始化
*/
void NetworkUnInit();

/**
 * @brief 信息上报函数
 * @param [in]  上报内容
 * @return 成功返回 0
 *         失败返回 其他值
 */
int NetworkUploadInfo(NetworkUpload* upload_info);

#ifdef __cplusplus
};
#endif

#endif